package main

import (
	"embed"
	"fmt"
	"gin-learn/routers"
	"github.com/gin-gonic/gin"
	"html/template"
	"net/http"
)

//go:embed templates
var tmpl embed.FS

func main() {
	/*// 创建路由
	r := gin.Default()
	// 绑定路由规则，执行的函数
	// gin.Context,  封装了request和response
	r.GET("/path/:id", func(context *gin.Context) {
		context.JSON(200,gin.H{
			"success":"get",
		})
	})
	r.POST("/post", func(context *gin.Context) {
		context.JSON(200,gin.H{
			"success":"post",
		})
	})
	r.PUT("/put", func(context *gin.Context) {
		context.JSON(200,gin.H{
			"success":"put",
		})
	})
	r.DELETE("/del", func(context *gin.Context) {
		context.JSON(200,gin.H{
			"success":"del",
		})
	})

	// API参数
	r.GET("/user/:name/*action", func(context *gin.Context) {
		name := context.Param("name")
		action := context.Param("action")
		//截取
		action = strings.Trim(action,"/")
		context.String(http.StatusOK,name + " is " +action)
	})

	// URL参数
	// URL参数可以通过DefaultQuery()或者 Query() 方法获取
	// DefaultQuery()参数如果不存在，返回默认值， Query() 如果不存在，则返回空串
	r.GET("/guser", func(context *gin.Context) {
		name := context.DefaultQuery("name","6666666")
		context.String(http.StatusOK,fmt.Sprintf("helllo %s",name))
	})

	// 表单参数
	r.POST("/form", func(context *gin.Context) {
		types := context.DefaultPostForm("type","post")
		username := context.PostForm("username")
		password := context.PostForm("userpassword")
		context.String(http.StatusOK,
			fmt.Sprintf("username: %s, password: %s, type: %s",username,password,types))
	})

	// 上传单个文件
	// 限制上传文件的尺寸 ,gin文件上传与原生的net/http方法类似，不同在于gin把原生的request封装到c.Request中
	r.MaxMultipartMemory = 8 << 20
	r.POST("/upload", func(context *gin.Context) {
		file ,err := context.FormFile("file")
		if err != nil {
			context.String(http.StatusInternalServerError,"上传文件出错")
		}
		context.SaveUploadedFile(file,file.Filename)
		context.String(http.StatusOK,file.Filename)
	})

	// 上传多个文件
	r.MaxMultipartMemory = 8 << 20
	r.POST("/uploads", func(context *gin.Context) {
		form ,err := context.MultipartForm()
		if err != nil {
			context.String(http.StatusBadRequest,fmt.Sprintf("上传文件失败 %s",err.Error()))
		}
		files := form.File["files"]
		// 遍历所有文件
		for _, file := range files {
			// 逐个文件存储
			if err := context.SaveUploadedFile(file,file.Filename); err != nil{
				context.String(http.StatusBadRequest,fmt.Sprintf("上传文件失败 %s",err.Error()))
				return
			}
		} //for
		context.String(http.StatusOK,fmt.Sprintf("上传 %d 个文件, 成功",len(files)))
	})

	v1 := r.Group("/v1")
	{
		v1.GET("login",login)
		v1.GET("submit",submit)
	}

	v2 := r.Group("v2")
	{
		v2.POST("/login",login)
		v2.POST("submit",submit)
	}*/
	//var static embed.FS
	// 路由拆分成单独的文件或者包
	r := routers.SetupRouter()
	t, _ := template.ParseFS(tmpl, "templates/*.tmpl")
	r.SetHTMLTemplate(t)
	r.GET("/index", func(context *gin.Context) {
		context.HTML(http.StatusOK, "index.html",
			gin.H{
				"title": "页面测试",
			})
	})
	if err := r.Run(); err != nil {
		fmt.Println("启动失败, err %v \n", err)
	}

}

func login(c *gin.Context) {
	name := c.DefaultQuery("name", "TOM")
	c.String(http.StatusOK, fmt.Sprintf("hello %s \n", name))
}

func submit(c *gin.Context) {
	name := c.DefaultQuery("name", "jerry")
	c.String(http.StatusOK, fmt.Sprintf("hello %s \n", name))
}
